package com.example.zyl.common.query.page;

import lombok.Getter;

import java.util.List;

/**
 * 分页工具类
 *
 * @author zyl
 */
@Getter
public class PageUtil {

    /**
     * 当前页码
     */
    private final int currentPage;

    /**
     * 每页条目数
     */
    private final int pageSize;

    /**
     * 数据库查询起始位置
     */
    private final int offset;

    /**
     * 数据库查询结束位置
     */
    private final int limit;

    // 构造函数
    public PageUtil(int currentPage, int pageSize) {
        // 页码不能小于1，默认设置为1
        this.currentPage = (currentPage > 0) ? currentPage : 1;
        // 每页条目数必须大于0，默认设置为10
        this.pageSize = (pageSize > 0) ? pageSize : 10;

        // 计算数据库查询的起始位置
        this.offset = (this.currentPage - 1) * this.pageSize;

        this.limit = pageSize;
    }

    // 用于计算总页数（总记录数在外部提供）
    public int calculateTotalPages(int totalRecords) {
        if (totalRecords <= 0) {
            return 0; // 没有记录时返回0页
        }
        return (int) Math.ceil((double) totalRecords / pageSize);
    }



    /**
     * 自定义物理分页工具类
     *
     * @param list 原list
     * @param page 页码
     * @param rows 每页多少条数据
     * @return 分页后的list
     */
    public static List startPage(List list, Integer page,
                                 Integer rows) {
        if (list == null) {
            return null;
        }
        if (list.size() == 0) {
            return null;
        }

        Integer count = list.size(); // 记录总数
        int pageCount; // 页数
        if (count % rows == 0) {
            pageCount = count / rows;
        } else {
            pageCount = count / rows + 1;
        }

        int fromIndex = 0; // 开始索引
        int toIndex = 0; // 结束索引

        if (!page.equals(pageCount)) {
            fromIndex = (page - 1) * rows;
            toIndex = fromIndex + rows;
        } else {
            fromIndex = (page - 1) * rows;
            toIndex = count;
        }

        return list.subList(fromIndex, toIndex);
    }
}
